package handler

import (
	"strconv"

	"admin-system/internal/service"
	"admin-system/pkg/response"
	"github.com/gin-gonic/gin"
)

// AuthHandler 认证控制器
type AuthHandler struct {
	authService *service.AuthService
}

// NewAuthHandler 创建认证控制器
func NewAuthHandler() *AuthHandler {
	return &AuthHandler{
		authService: service.NewAuthService(),
	}
}

// Login 用户登录
func (h *AuthHandler) Login(c *gin.Context) {
	var req service.LoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	// 执行登录
	loginResp, err := h.authService.Login(&req)
	if err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, loginResp)
}

// GetUserInfo 获取用户信息
func (h *AuthHandler) GetUserInfo(c *gin.Context) {
	// 从上下文获取用户ID
	userIDInterface, exists := c.Get("userID")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	userID, ok := userIDInterface.(uint)
	if !ok {
		response.Unauthorized(c, "用户ID格式错误")
		return
	}

	// 获取用户信息
	userInfo, err := h.authService.GetUserInfo(userID)
	if err != nil {
		response.ServerError(c, "获取用户信息失败: "+err.Error())
		return
	}

	response.Success(c, userInfo)
}

// GetUserMenus 获取用户菜单
func (h *AuthHandler) GetUserMenus(c *gin.Context) {
	// 从上下文获取用户ID
	userIDInterface, exists := c.Get("userID")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	userID, ok := userIDInterface.(uint)
	if !ok {
		response.Unauthorized(c, "用户ID格式错误")
		return
	}

	// 获取用户信息（包含菜单）
	userInfo, err := h.authService.GetUserInfo(userID)
	if err != nil {
		response.ServerError(c, "获取用户菜单失败: "+err.Error())
		return
	}

	response.Success(c, gin.H{
		"menus": userInfo.Menus,
	})
}

// RefreshToken 刷新令牌
func (h *AuthHandler) RefreshToken(c *gin.Context) {
	// 从请求头获取当前令牌
	authHeader := c.GetHeader("Authorization")
	if authHeader == "" {
		response.BadRequest(c, "缺少认证令牌")
		return
	}

	// 提取令牌
	token := authHeader[7:] // 去掉 "Bearer " 前缀

	// 刷新令牌
	newToken, err := h.authService.RefreshToken(token)
	if err != nil {
		response.Error(c, 400, "刷新令牌失败: "+err.Error())
		return
	}

	response.Success(c, gin.H{
		"token": newToken,
	})
}

// Logout 用户登出
func (h *AuthHandler) Logout(c *gin.Context) {
	// 从上下文获取用户ID
	userIDInterface, exists := c.Get("userID")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	userID, ok := userIDInterface.(uint)
	if !ok {
		response.Unauthorized(c, "用户ID格式错误")
		return
	}

	// 执行登出
	err := h.authService.Logout(userID)
	if err != nil {
		response.ServerError(c, "登出失败: "+err.Error())
		return
	}

	response.Success(c, gin.H{
		"message": "登出成功",
	})
}

// ChangePassword 修改密码
func (h *AuthHandler) ChangePassword(c *gin.Context) {
	// 从上下文获取用户ID
	userIDInterface, exists := c.Get("userID")
	if !exists {
		response.Unauthorized(c, "未授权")
		return
	}

	userID, ok := userIDInterface.(uint)
	if !ok {
		response.Unauthorized(c, "用户ID格式错误")
		return
	}

	// 绑定请求参数
	var req struct {
		OldPassword string `json:"old_password" binding:"required"`
		NewPassword string `json:"new_password" binding:"required,min=6"`
	}
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	// 修改密码
	userService := service.NewUserService()
	err := userService.ChangePassword(userID, req.OldPassword, req.NewPassword)
	if err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, gin.H{
		"message": "密码修改成功",
	})
}

// ResetPassword 重置密码（管理员功能）
func (h *AuthHandler) ResetPassword(c *gin.Context) {
	// 获取用户ID参数
	userIDStr := c.Param("id")
	userID, err := strconv.ParseUint(userIDStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的用户ID")
		return
	}

	// 绑定请求参数
	var req struct {
		NewPassword string `json:"new_password" binding:"required,min=6"`
	}
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	// 重置密码
	userService := service.NewUserService()
	err = userService.ResetPassword(uint(userID), req.NewPassword)
	if err != nil {
		response.Error(c, 400, err.Error())
		return
	}

	response.Success(c, gin.H{
		"message": "密码重置成功",
	})
}
